package view.profissional;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.NumberFormat;
import java.text.ParseException;

import javax.swing.ButtonGroup;
import javax.swing.DefaultComboBoxModel;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.border.EmptyBorder;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.MaskFormatter;
import javax.swing.text.NumberFormatter;

import model.entidades.DadosProfissional;
import model.entidades.Usuario;
import utils.Constantes;
import utils.Criptografia;
import utils.Formatacao;
import view.componentes.CustomDocumentFilter;
import view.componentes.GenericPlainDocument;
import view.componentes.GenericWindowListener;
import view.principal.TelaPrincipal;

import com.toedter.calendar.JDateChooser;

import controller.ControladorExcecao;
import controller.ControladorProfissional;


public class TelaCadastrarProfissional extends JDialog implements ActionListener, PropertyChangeListener {

	private static final long serialVersionUID = 1L;

	private JPanel panelNorte;
	private final JPanel panelCentro = new JPanel();
	private JPanel panelSul;

	private JLabel lblCadastrarProfissional;
	private JLabel lblDadosPessoais;
	private JLabel lblNomeCompleto; 
	private JLabel lblDataNascimento;
	private JLabel lblSexo;
	private JLabel lblCpf;
	private JLabel lblRg;
	private JLabel lblContato;
	private JLabel lblTelefone;
	private JLabel lblCelular;
	private JLabel lblEmail;
	private JLabel label;
	private JLabel lblDadosDeAcesso;
	private JLabel lblLogin;
	private JLabel lblSenha;
	private JLabel lblConfirmacaoSenha;
	private JLabel lblSituacao;
	private JLabel lblOrgaoEmissor;
	private JLabel lblCrm;
	private JLabel lblHorarioAtendimento;
	private JLabel lblInicio;
	private JLabel lblFim;

	private JTextField txtNomeCompleto;
	private JTextField txtRgNumero;
	private JTextField txtEmail;
	private JTextField txtRgOrgao;
	private JTextField txtLogin;	
	private JTextField txtEspecialidade;
	private JTextField txtCrm;
	private JFormattedTextField txtValorConsulta;

	private JPasswordField txtSenha;
	private JPasswordField txtConfirmaSenha;

	private JFormattedTextField txtCpf;
	private JFormattedTextField txtTelefone;
	private JFormattedTextField txtCelular;

	private MaskFormatter mascaraCpf;
	private MaskFormatter mascaraCep;
	private MaskFormatter mascaraTelefone;
	private MaskFormatter mascaraCelular;

	private JRadioButton rdbtnMasculino;
	private JRadioButton rdbtnFeminino;
	private ButtonGroup grupoSexo;

	private JCheckBox chckbxUsuarioAdministrador;

	private JComboBox<String> comboBoxRgUF;
	private JComboBox<String> comboBoxCrmUF;

	private JRadioButton rdbtnAtivo;
	private JRadioButton rdbtnInativo;
	private ButtonGroup grupoSituacao;

	private JButton btnSalvar;
	private JButton btnCancelar;
	private JButton btnEditar;

	private JDateChooser txtDataNascimento;

	private JComboBox<String> comboBoxHoraInicio;
	private JComboBox<String> comboBoxHoraFim;

	private Usuario usuario;
	private DadosProfissional dadosProfissional;
	private JLabel lblEspecialidade;

	private NumberFormat valorConsultaDisplayFormat;

	private NumberFormat valorConsultaEditFormat;
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {

		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
						if ("Nimbus".equals(info.getName())) {
							UIManager.setLookAndFeel(info.getClassName());
							break;
						}else{
							UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
						}
					}
					TelaCadastrarProfissional window = new TelaCadastrarProfissional(null);
					window.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});		
	}

	/**
	 * Create the dialog.
	 */
	public TelaCadastrarProfissional(Usuario usuario) {

		inicializaComponentes();
		chckbxUsuarioAdministrador.setVisible(false);
		if(usuario == null){
			limparCamposTexto();
			btnEditar.setVisible(false);
			this.usuario = new Usuario();
			this.dadosProfissional = new DadosProfissional();
		} else {
			this.usuario = usuario;
			this.dadosProfissional = usuario.getDadosProfissional();
			habilitaDesabilitaCampos(false);
			preencheCampos();

			if (TelaPrincipal.getUsuarioLogado().getTipoPerfil().equalsIgnoreCase(Constantes.TIPO_PERFIL_ADM)) {
				btnEditar.setVisible(true);
			} else {
				btnEditar.setVisible(false);
			}
		}

	}

	private void inicializaComponentes() {
		setUpFormats();
		setBounds(100, 100, 600, 635);
		setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
		this.addWindowListener(new GenericWindowListener());
		setResizable(false);
		setModal(true);
		setLocationRelativeTo(null);
		getContentPane().setLayout(new BorderLayout());
		panelCentro.setBackground(Color.WHITE);
		panelCentro.setBorder(new EmptyBorder(5, 0, 5, 5));
		getContentPane().add(panelCentro, BorderLayout.CENTER);

		lblDadosPessoais = new JLabel("Dados Pessoais");
		lblDadosPessoais.setBorder(new EmptyBorder(0, 0, 0, 5));
		lblDadosPessoais.setHorizontalAlignment(SwingConstants.RIGHT);
		lblDadosPessoais.setOpaque(true);
		lblDadosPessoais.setBackground(Color.LIGHT_GRAY);
		lblDadosPessoais.setFont(new Font("Tahoma", Font.BOLD, 12));

		lblNomeCompleto = new JLabel("Nome Completo:");

		txtNomeCompleto = new JTextField();
		txtNomeCompleto.setDocument(new GenericPlainDocument(CustomDocumentFilter.criar(
				CustomDocumentFilter.SO_LETRAS, CustomDocumentFilter.MAIUSCULAS, 0)));
		txtNomeCompleto.setColumns(10);

		lblDataNascimento = new JLabel("Data Nascimento:");

		rdbtnMasculino = new JRadioButton("Masculino");
		rdbtnMasculino.setActionCommand(Constantes.SEXO_MASCULINO);
		rdbtnMasculino.setBackground(Color.WHITE);

		rdbtnFeminino = new JRadioButton("Feminino");
		rdbtnFeminino.setActionCommand(Constantes.SEXO_FEMININO);
		rdbtnFeminino.setBackground(Color.WHITE);

		grupoSexo = new ButtonGroup();
		grupoSexo.add(rdbtnMasculino);
		grupoSexo.add(rdbtnFeminino);
		grupoSexo.setSelected(rdbtnMasculino.getModel(), true);

		lblSexo = new JLabel("Sexo:");

		lblCpf = new JLabel("CPF:");

		try {
			mascaraCpf = new MaskFormatter("###.###.###-##");
			mascaraCpf.setPlaceholderCharacter('_');
		} catch (ParseException e) {
			e.printStackTrace();
		}

		txtCpf = new JFormattedTextField(mascaraCpf);
		txtCpf.setColumns(10);

		txtRgNumero = new JTextField();
		txtRgNumero.setDocument(new GenericPlainDocument(CustomDocumentFilter.criar(
				CustomDocumentFilter.SO_NUMEROS, CustomDocumentFilter.MAIUSCULAS, 0)));
		txtRgNumero.setColumns(10);

		lblRg = new JLabel("RG:");

		try {
			mascaraCep = new MaskFormatter("##.###-###");
			mascaraCep.setPlaceholderCharacter('_');
		} catch (ParseException e) {
			e.printStackTrace();
		}

		lblContato = new JLabel("Contato");
		lblContato.setOpaque(true);
		lblContato.setHorizontalAlignment(SwingConstants.RIGHT);
		lblContato.setFont(new Font("Tahoma", Font.BOLD, 12));
		lblContato.setBorder(new EmptyBorder(0, 0, 0, 5));
		lblContato.setBackground(Color.LIGHT_GRAY);

		try {
			mascaraTelefone = new MaskFormatter("(##) ####-####");
			mascaraTelefone.setPlaceholderCharacter('_');
		} catch (ParseException e) {
			e.printStackTrace();
		}

		txtTelefone = new JFormattedTextField(mascaraTelefone);
		txtTelefone.setColumns(10);

		lblTelefone = new JLabel("Telefone:");

		try {
			mascaraCelular = new MaskFormatter("(##) ####-####");
			mascaraCelular.setPlaceholderCharacter('_');
		} catch (ParseException e) {
			e.printStackTrace();
		}

		txtCelular = new JFormattedTextField(mascaraCelular);
		txtCelular.setColumns(10);

		lblCelular = new JLabel("Celular:");

		txtDataNascimento = new JDateChooser();
		txtDataNascimento.getCalendarButton().setBackground(Color.WHITE);
		txtDataNascimento.setOpaque(false);

		label = new JLabel("-");
		label.setFont(new Font("SansSerif", Font.PLAIN, 16));

		txtEmail = new JTextField();
		txtEmail.setDocument(new GenericPlainDocument(CustomDocumentFilter.criar(
				CustomDocumentFilter.SEM_RESTRICAO, CustomDocumentFilter.MINUSCULAS, 0)));
		txtEmail.setColumns(10);

		lblEmail = new JLabel("Email:");

		lblDadosDeAcesso = new JLabel("Dados de Acesso");
		lblDadosDeAcesso.setOpaque(true);
		lblDadosDeAcesso.setHorizontalAlignment(SwingConstants.RIGHT);
		lblDadosDeAcesso.setFont(new Font("Tahoma", Font.BOLD, 12));
		lblDadosDeAcesso.setBorder(new EmptyBorder(0, 0, 0, 5));
		lblDadosDeAcesso.setBackground(Color.LIGHT_GRAY);

		lblLogin = new JLabel("Login:");

		txtLogin = new JTextField();
		txtLogin.setColumns(10);

		lblSenha = new JLabel("Senha:");

		txtSenha = new JPasswordField();
		txtSenha.setEchoChar('●');
		txtSenha.setColumns(10);

		txtConfirmaSenha = new JPasswordField();
		txtConfirmaSenha.setEchoChar('●');
		txtConfirmaSenha.setColumns(10);

		lblConfirmacaoSenha = new JLabel("Confirma\u00E7\u00E3o de Senha:");

		chckbxUsuarioAdministrador = new JCheckBox("Usu\u00E1rio Administrador");

		JLabel lblDadosProfissionais = new JLabel("Dados Profissionais");
		lblDadosProfissionais.setOpaque(true);
		lblDadosProfissionais.setHorizontalAlignment(SwingConstants.RIGHT);
		lblDadosProfissionais.setFont(new Font("Tahoma", Font.BOLD, 12));
		lblDadosProfissionais.setBorder(new EmptyBorder(0, 0, 0, 5));
		lblDadosProfissionais.setBackground(Color.LIGHT_GRAY);

		lblEspecialidade = new JLabel("Especialidade:");

		txtEspecialidade = new JTextField();
		txtEspecialidade.setDocument(new GenericPlainDocument(CustomDocumentFilter.criar(
				CustomDocumentFilter.SO_LETRAS, CustomDocumentFilter.MAIUSCULAS, 0)));
		txtEspecialidade.setColumns(10);

		txtCrm = new JTextField();
		txtCrm.setDocument(new GenericPlainDocument(CustomDocumentFilter.criar(
				CustomDocumentFilter.SEM_RESTRICAO, CustomDocumentFilter.MAIUSCULAS, 0)));
		txtCrm.setColumns(10);

		lblCrm = new JLabel("Orgão Registro Profissional / UF:");

		JLabel label_3 = new JLabel("/");
		label_3.setFont(new Font("SansSerif", Font.PLAIN, 14));

		comboBoxCrmUF = new JComboBox<String>();
		comboBoxCrmUF.setModel(new DefaultComboBoxModel<String>(Constantes.SIGLAS_ESTADOS));
		comboBoxCrmUF.setBackground(Color.WHITE);

		txtValorConsulta = new JFormattedTextField(new DefaultFormatterFactory(
				new NumberFormatter(valorConsultaDisplayFormat),
				new NumberFormatter(valorConsultaDisplayFormat),
				new NumberFormatter(valorConsultaEditFormat)));
		txtValorConsulta.setColumns(10);

		JLabel lblValorConsulta = new JLabel("Valor Consulta:");

		lblOrgaoEmissor = new JLabel("Orgao Emissor / UF:");

		txtRgOrgao = new JTextField();
		txtRgOrgao.setDocument(new GenericPlainDocument(CustomDocumentFilter.criar(
				CustomDocumentFilter.SO_LETRAS, CustomDocumentFilter.MAIUSCULAS, 0)));
		txtRgOrgao.setColumns(10);

		JLabel label_4 = new JLabel("/");
		label_4.setFont(new Font("SansSerif", Font.PLAIN, 16));

		comboBoxRgUF = new JComboBox<String>();
		comboBoxRgUF.setModel(new DefaultComboBoxModel<String>(Constantes.SIGLAS_ESTADOS));
		comboBoxRgUF.setBackground(Color.WHITE);

		lblSituacao = new JLabel("Situação");

		rdbtnAtivo = new JRadioButton("Ativo");
		rdbtnAtivo.setActionCommand(Constantes.ATIVO);
		rdbtnAtivo.setBackground(Color.WHITE);

		rdbtnInativo = new JRadioButton("Inativo");
		rdbtnInativo.setActionCommand(Constantes.INATIVO);
		rdbtnInativo.setBackground(Color.WHITE);

		grupoSituacao = new ButtonGroup();
		grupoSituacao.add(rdbtnAtivo);
		grupoSituacao.add(rdbtnInativo);
		grupoSituacao.setSelected(rdbtnAtivo.getModel(), true);

		lblHorarioAtendimento = new JLabel("Horário de Atendimento:");

		lblInicio = new JLabel("Inicio:");

		comboBoxHoraInicio = new JComboBox<String>();
		comboBoxHoraInicio.setModel(new DefaultComboBoxModel<String>(Constantes.HORARIO_ATENDIMENTO));
		comboBoxHoraInicio.setBackground(Color.WHITE);

		lblFim = new JLabel("Fim:");

		comboBoxHoraFim = new JComboBox<String>();
		comboBoxHoraFim.setModel(new DefaultComboBoxModel<String>(Constantes.HORARIO_ATENDIMENTO));
		comboBoxHoraFim.setBackground(Color.WHITE);
		GroupLayout gl_panelCentro = new GroupLayout(panelCentro);
		gl_panelCentro.setHorizontalGroup(
				gl_panelCentro.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panelCentro.createSequentialGroup()
						.addGroup(gl_panelCentro.createParallelGroup(Alignment.LEADING)
								.addComponent(lblDadosPessoais, GroupLayout.PREFERRED_SIZE, 188, GroupLayout.PREFERRED_SIZE)
								.addGroup(gl_panelCentro.createSequentialGroup()
										.addGap(6)
										.addComponent(lblNomeCompleto)
										.addGap(219)
										.addComponent(lblDataNascimento)
										.addGap(36)
										.addComponent(lblSexo)
										.addGap(12)
										.addComponent(rdbtnMasculino))
										.addGroup(gl_panelCentro.createSequentialGroup()
												.addGap(6)
												.addComponent(txtNomeCompleto, GroupLayout.PREFERRED_SIZE, 295, GroupLayout.PREFERRED_SIZE)
												.addGap(18)
												.addComponent(txtDataNascimento, GroupLayout.PREFERRED_SIZE, 124, GroupLayout.PREFERRED_SIZE)
												.addGap(53)
												.addComponent(rdbtnFeminino))
												.addGroup(gl_panelCentro.createSequentialGroup()
														.addGap(6)
														.addComponent(lblCpf)
														.addGap(92)
														.addComponent(lblRg)
														.addGap(99)
														.addComponent(lblOrgaoEmissor)
														.addGap(21)
														.addComponent(lblSituacao))
														.addGroup(gl_panelCentro.createSequentialGroup()
																.addGap(6)
																.addComponent(txtCpf, GroupLayout.PREFERRED_SIZE, 101, GroupLayout.PREFERRED_SIZE)
																.addGap(18)
																.addComponent(txtRgNumero, GroupLayout.PREFERRED_SIZE, 103, GroupLayout.PREFERRED_SIZE)
																.addGap(6)
																.addComponent(label)
																.addGap(6)
																.addComponent(txtRgOrgao, GroupLayout.PREFERRED_SIZE, 48, GroupLayout.PREFERRED_SIZE)
																.addGap(5)
																.addComponent(label_4)
																.addGap(6)
																.addComponent(comboBoxRgUF, GroupLayout.PREFERRED_SIZE, 58, GroupLayout.PREFERRED_SIZE)
																.addGap(12)
																.addComponent(rdbtnAtivo, GroupLayout.PREFERRED_SIZE, 48, GroupLayout.PREFERRED_SIZE)
																.addGap(6)
																.addComponent(rdbtnInativo))
																.addComponent(lblDadosProfissionais, GroupLayout.PREFERRED_SIZE, 188, GroupLayout.PREFERRED_SIZE)
																.addComponent(lblContato, GroupLayout.PREFERRED_SIZE, 188, GroupLayout.PREFERRED_SIZE)
																.addGroup(gl_panelCentro.createSequentialGroup()
																		.addGap(6)
																		.addComponent(lblTelefone)
																		.addGap(89)
																		.addComponent(lblCelular)
																		.addGap(97)
																		.addComponent(lblEmail))
																		.addGroup(gl_panelCentro.createSequentialGroup()
																				.addGap(6)
																				.addComponent(txtTelefone, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
																				.addGap(18)
																				.addComponent(txtCelular, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
																				.addGap(18)
																				.addComponent(txtEmail, GroupLayout.PREFERRED_SIZE, 228, GroupLayout.PREFERRED_SIZE))
																				.addComponent(lblDadosDeAcesso, GroupLayout.PREFERRED_SIZE, 188, GroupLayout.PREFERRED_SIZE)
																				.addGroup(gl_panelCentro.createSequentialGroup()
																						.addGap(6)
																						.addComponent(lblLogin))
																						.addGroup(gl_panelCentro.createSequentialGroup()
																								.addGap(6)
																								.addComponent(txtLogin, GroupLayout.PREFERRED_SIZE, 182, GroupLayout.PREFERRED_SIZE)
																								.addGap(18)
																								.addComponent(chckbxUsuarioAdministrador))
																								.addGroup(gl_panelCentro.createSequentialGroup()
																										.addGap(6)
																										.addComponent(lblSenha)
																										.addGap(161)
																										.addComponent(lblConfirmacaoSenha))
																										.addGroup(gl_panelCentro.createSequentialGroup()
																												.addGap(6)
																												.addComponent(txtSenha, GroupLayout.PREFERRED_SIZE, 182, GroupLayout.PREFERRED_SIZE)
																												.addGap(18)
																												.addComponent(txtConfirmaSenha, GroupLayout.PREFERRED_SIZE, 182, GroupLayout.PREFERRED_SIZE))
																												.addGroup(gl_panelCentro.createSequentialGroup()
																														.addContainerGap()
																														.addComponent(lblHorarioAtendimento))
																														.addGroup(gl_panelCentro.createSequentialGroup()
																																.addContainerGap()
																																.addComponent(lblInicio)
																																.addPreferredGap(ComponentPlacement.RELATED)
																																.addComponent(comboBoxHoraInicio, GroupLayout.PREFERRED_SIZE, 64, GroupLayout.PREFERRED_SIZE)
																																.addGap(24)
																																.addComponent(lblFim)
																																.addPreferredGap(ComponentPlacement.RELATED)
																																.addComponent(comboBoxHoraFim, GroupLayout.PREFERRED_SIZE, 64, GroupLayout.PREFERRED_SIZE))
																																.addGroup(gl_panelCentro.createSequentialGroup()
																																		.addGap(6)
																																		.addGroup(gl_panelCentro.createParallelGroup(Alignment.TRAILING, false)
																																				.addGroup(gl_panelCentro.createSequentialGroup()
																																						.addComponent(txtEspecialidade, GroupLayout.PREFERRED_SIZE, 151, GroupLayout.PREFERRED_SIZE)
																																						.addGap(18)
																																						.addComponent(txtCrm, GroupLayout.PREFERRED_SIZE, 104, GroupLayout.PREFERRED_SIZE)
																																						.addGap(6)
																																						.addComponent(label_3)
																																						.addGap(6)
																																						.addComponent(comboBoxCrmUF, GroupLayout.PREFERRED_SIZE, 58, GroupLayout.PREFERRED_SIZE)
																																						.addGap(15)
																																						.addComponent(txtValorConsulta, 0, 0, Short.MAX_VALUE))
																																						.addGroup(Alignment.LEADING, gl_panelCentro.createSequentialGroup()
																																								.addComponent(lblEspecialidade)
																																								.addGap(87)
																																								.addComponent(lblCrm)
																																								.addGap(12)
																																								.addComponent(lblValorConsulta)))))
																																								.addContainerGap(15, Short.MAX_VALUE))
				);
		gl_panelCentro.setVerticalGroup(
				gl_panelCentro.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_panelCentro.createSequentialGroup()
						.addGap(6)
						.addComponent(lblDadosPessoais)
						.addGap(12)
						.addGroup(gl_panelCentro.createParallelGroup(Alignment.LEADING)
								.addComponent(lblNomeCompleto)
								.addGroup(gl_panelCentro.createSequentialGroup()
										.addGap(1)
										.addComponent(lblDataNascimento))
										.addGroup(gl_panelCentro.createSequentialGroup()
												.addGap(1)
												.addComponent(lblSexo))
												.addComponent(rdbtnMasculino))
												.addGap(4)
												.addGroup(gl_panelCentro.createParallelGroup(Alignment.LEADING)
														.addComponent(txtNomeCompleto, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
														.addComponent(txtDataNascimento, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
														.addGroup(gl_panelCentro.createSequentialGroup()
																.addGap(8)
																.addComponent(rdbtnFeminino)))
																.addGap(6)
																.addGroup(gl_panelCentro.createParallelGroup(Alignment.LEADING)
																		.addComponent(lblCpf)
																		.addComponent(lblRg)
																		.addComponent(lblOrgaoEmissor)
																		.addComponent(lblSituacao))
																		.addGap(6)
																		.addGroup(gl_panelCentro.createParallelGroup(Alignment.LEADING)
																				.addComponent(txtCpf, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
																				.addComponent(txtRgNumero, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
																				.addGroup(gl_panelCentro.createSequentialGroup()
																						.addGap(2)
																						.addComponent(label))
																						.addComponent(txtRgOrgao, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
																						.addGroup(gl_panelCentro.createSequentialGroup()
																								.addGap(2)
																								.addComponent(label_4))
																								.addGroup(gl_panelCentro.createSequentialGroup()
																										.addGap(1)
																										.addComponent(comboBoxRgUF, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
																										.addGroup(gl_panelCentro.createSequentialGroup()
																												.addGap(5)
																												.addComponent(rdbtnAtivo))
																												.addGroup(gl_panelCentro.createSequentialGroup()
																														.addGap(5)
																														.addComponent(rdbtnInativo)))
																														.addGap(12)
																														.addComponent(lblDadosProfissionais)
																														.addGap(12)
																														.addGroup(gl_panelCentro.createParallelGroup(Alignment.LEADING)
																																.addComponent(lblEspecialidade)
																																.addComponent(lblCrm)
																																.addComponent(lblValorConsulta))
																																.addGap(6)
																																.addGroup(gl_panelCentro.createParallelGroup(Alignment.LEADING)
																																		.addGroup(gl_panelCentro.createSequentialGroup()
																																				.addGroup(gl_panelCentro.createParallelGroup(Alignment.LEADING)
																																						.addComponent(txtEspecialidade, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
																																						.addComponent(txtCrm, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
																																						.addGroup(gl_panelCentro.createSequentialGroup()
																																								.addGap(4)
																																								.addComponent(label_3))
																																								.addGroup(gl_panelCentro.createSequentialGroup()
																																										.addGap(1)
																																										.addComponent(comboBoxCrmUF, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)))
																																										.addPreferredGap(ComponentPlacement.RELATED)
																																										.addComponent(lblHorarioAtendimento)
																																										.addPreferredGap(ComponentPlacement.RELATED, 16, Short.MAX_VALUE)
																																										.addGroup(gl_panelCentro.createParallelGroup(Alignment.BASELINE)
																																												.addComponent(lblInicio)
																																												.addComponent(lblFim)
																																												.addComponent(comboBoxHoraFim, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
																																												.addComponent(comboBoxHoraInicio, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
																																												.addPreferredGap(ComponentPlacement.UNRELATED)
																																												.addComponent(lblContato)
																																												.addGap(6)
																																												.addGroup(gl_panelCentro.createParallelGroup(Alignment.LEADING)
																																														.addComponent(lblTelefone)
																																														.addComponent(lblCelular)
																																														.addComponent(lblEmail))
																																														.addGap(6))
																																														.addGroup(gl_panelCentro.createSequentialGroup()
																																																.addComponent(txtValorConsulta, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
																																																.addPreferredGap(ComponentPlacement.RELATED)))
																																																.addGroup(gl_panelCentro.createParallelGroup(Alignment.LEADING)
																																																		.addComponent(txtTelefone, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
																																																		.addComponent(txtCelular, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
																																																		.addComponent(txtEmail, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
																																																		.addGap(12)
																																																		.addComponent(lblDadosDeAcesso)
																																																		.addGap(12)
																																																		.addComponent(lblLogin)
																																																		.addGap(6)
																																																		.addGroup(gl_panelCentro.createParallelGroup(Alignment.LEADING)
																																																				.addComponent(txtLogin, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
																																																				.addGroup(gl_panelCentro.createSequentialGroup()
																																																						.addGap(5)
																																																						.addComponent(chckbxUsuarioAdministrador)))
																																																						.addGap(12)
																																																						.addGroup(gl_panelCentro.createParallelGroup(Alignment.LEADING)
																																																								.addComponent(lblSenha)
																																																								.addComponent(lblConfirmacaoSenha))
																																																								.addGap(6)
																																																								.addGroup(gl_panelCentro.createParallelGroup(Alignment.LEADING)
																																																										.addComponent(txtSenha, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
																																																										.addComponent(txtConfirmaSenha, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)))
				);
		panelCentro.setLayout(gl_panelCentro);
		{
			panelSul = new JPanel();
			panelSul.setLayout(new FlowLayout(FlowLayout.RIGHT));
			getContentPane().add(panelSul, BorderLayout.SOUTH);

			btnEditar = new JButton("Editar");
			btnEditar.setActionCommand("EDITAR");
			btnEditar.addActionListener(this);
			panelSul.add(btnEditar);
			{
				btnSalvar = new JButton("Salvar");
				btnSalvar.setActionCommand("OK");
				btnSalvar.addActionListener(this);
				panelSul.add(btnSalvar);
				getRootPane().setDefaultButton(btnSalvar);
			}
			{
				btnCancelar = new JButton("Cancelar");
				btnCancelar.setActionCommand("Cancel");
				btnCancelar.addActionListener(this);
				panelSul.add(btnCancelar);
			}
		}
		{
			panelNorte = new JPanel();
			panelNorte.setForeground(Color.WHITE);
			panelNorte.setBackground(Color.BLUE);
			getContentPane().add(panelNorte, BorderLayout.NORTH);

			lblCadastrarProfissional = new JLabel("Cadastrar Profissional");
			lblCadastrarProfissional.setForeground(Color.WHITE);
			lblCadastrarProfissional.setFont(new Font("Tahoma", Font.BOLD, 18));
			panelNorte.add(lblCadastrarProfissional);
		}

		txtValorConsulta.addPropertyChangeListener(this);

	}//inicializaComponentes()

	/**
	 * Habilita ou desabilita os campos para edicao
	 * 
	 * True: habilita.
	 * False: desabilita.
	 * 
	 * @param habilita
	 */
	private void habilitaDesabilitaCampos(boolean habilita) {

		txtNomeCompleto.setEnabled(habilita);
		txtDataNascimento.setEnabled(habilita);
		rdbtnMasculino.setEnabled(habilita);
		rdbtnFeminino.setEnabled(habilita);
		txtCpf.setEnabled(habilita);
		txtRgNumero.setEnabled(habilita);
		txtRgOrgao.setEnabled(habilita);
		comboBoxRgUF.setEnabled(habilita);

		rdbtnAtivo.setEnabled(habilita);
		rdbtnInativo.setEnabled(habilita);

		txtEspecialidade.setEnabled(habilita);
		txtCrm.setEnabled(habilita);
		comboBoxCrmUF.setEnabled(habilita);

		txtValorConsulta.setEnabled(habilita);

		comboBoxHoraInicio.setEnabled(habilita);
		comboBoxHoraFim.setEnabled(habilita);

		txtTelefone.setEnabled(habilita);
		txtCelular.setEnabled(habilita);
		txtEmail.setEnabled(habilita);

		txtLogin.setEnabled(habilita);
		txtSenha.setEnabled(habilita);
		txtConfirmaSenha.setEnabled(habilita);

		chckbxUsuarioAdministrador.setEnabled(habilita);

		btnSalvar.setEnabled(habilita);

	}//habilitaDesabilitaCampos()

	private void preencheCampos() {

		txtNomeCompleto.setText(usuario.getNome());
		txtDataNascimento.setDate(usuario.getDataNascimento().getTime());

		if(usuario.getSexo().equalsIgnoreCase(rdbtnMasculino.getActionCommand())) {
			rdbtnMasculino.setSelected(true);
		} else {
			rdbtnFeminino.setSelected(true);
		}

		txtCpf.setText(usuario.getCpf());
		txtRgNumero.setText(usuario.getRgNumero());
		txtRgOrgao.setText(usuario.getRgOrgao());

		comboBoxRgUF.setSelectedItem(usuario.getRgUF());

		if(usuario.getSituacao().equalsIgnoreCase(rdbtnAtivo.getActionCommand())) {
			rdbtnAtivo.setSelected(true);
		} else {
			rdbtnInativo.setSelected(true);
		}

		txtEspecialidade.setText(usuario.getDadosProfissional().getEspecialidade());
		txtCrm.setText(usuario.getDadosProfissional().getCrm());
		comboBoxCrmUF.setSelectedItem(usuario.getDadosProfissional().getCrmUF());

		txtValorConsulta.setValue(usuario.getDadosProfissional().getValorConsulta());

		comboBoxHoraInicio.setSelectedItem(usuario.getDadosProfissional().getHorarioInicioAtendimento());
		comboBoxHoraFim.setSelectedItem(usuario.getDadosProfissional().getHorarioFimAtendimento());

		txtTelefone.setText(usuario.getTelefone());
		txtCelular.setText(usuario.getCelular());
		txtEmail.setText(usuario.getEmail());

		txtLogin.setText(usuario.getLogin());
		txtSenha.setText("");
		txtConfirmaSenha.setText("");

	}//preencheCampos()

	private void editarUsuario(){

		btnEditar.setEnabled(false);
		habilitaDesabilitaCampos(true);

	}//editarPaciente()

	private void limparCamposTexto(){

		txtNomeCompleto.setText(null);
		txtDataNascimento.setDate(null);
		txtCpf.setText(null);
		txtRgNumero.setText(null);
		txtRgOrgao.setText(null);
		txtEspecialidade.setText(null);
		txtCrm.setText(null);
		txtValorConsulta.setValue(0.0);
		txtTelefone.setText(null);
		txtCelular.setText(null);
		txtEmail.setText(null);
		txtLogin.setText(null);
		chckbxUsuarioAdministrador.setSelected(false);
		txtSenha.setText(null);
		txtConfirmaSenha.setText(null);

	}//limparCamposTexto()

	private void cadastrarUsuario() {


		usuario.setNome(txtNomeCompleto.getText());
		usuario.setDataNascimento(txtDataNascimento.getCalendar());
		usuario.setSexo(grupoSexo.getSelection().getActionCommand());
		usuario.setCpf(Formatacao.removerCaracteresCPF(txtCpf.getText()));
		usuario.setRgNumero(txtRgNumero.getText());
		usuario.setRgOrgao(txtRgOrgao.getText());
		usuario.setRgUF((String) comboBoxRgUF.getSelectedItem());
		usuario.setSituacao(grupoSituacao.getSelection().getActionCommand());		
		usuario.setTipoPerfil(Constantes.TIPO_PERFIL_PROFISSIONAL);
		usuario.setTelefone(Formatacao.removerCaracteresTelefone(txtTelefone.getText()));
		usuario.setCelular(Formatacao.removerCaracteresTelefone(txtCelular.getText()));
		usuario.setEmail(txtEmail.getText());

		dadosProfissional.setEspecialidade(txtEspecialidade.getText());
		dadosProfissional.setCrm(txtCrm.getText());
		dadosProfissional.setCrmUF((String) comboBoxCrmUF.getSelectedItem());
		dadosProfissional.setValorConsulta(((Number)txtValorConsulta.getValue()).doubleValue());
		dadosProfissional.setHorarioInicioAtendimento((String) comboBoxHoraInicio.getSelectedItem());
		dadosProfissional.setHorarioFimAtendimento((String) comboBoxHoraFim.getSelectedItem());

		usuario.setDadosProfissional(dadosProfissional);
		usuario.setLogin(txtLogin.getText());
		usuario.setSenha(Criptografia.criptografaSenha(new String(txtSenha.getPassword())));

		//confirma o cadastro do paciente
		int confirmacao = JOptionPane.showConfirmDialog(this, "Deseja salvar o cadastro do profissional?", "Confirmação de Cadastro", JOptionPane.YES_NO_OPTION);

		if(confirmacao == JOptionPane.YES_OPTION){
			ControladorProfissional controladorProfissional = new ControladorProfissional(this);
			try {
				controladorProfissional.salvar(usuario);
				JOptionPane.showMessageDialog(this, "Cadastro efetuado com sucesso!", "Cadastro", JOptionPane.PLAIN_MESSAGE );
				this.dispose();
			} catch (ControladorExcecao e) {
				if(e.getMessage().equalsIgnoreCase(ControladorExcecao.USUARIO_NULO)){
					e.printStackTrace();
				} else {
					JOptionPane.showMessageDialog(this, e.getMessage(), "Erro de Validação", JOptionPane.OK_OPTION);
				}
			}
			//cria o controlador para fazer as verificacoes e salvar no banco.
			//utilizar try catch para recuperar os erros e mostrar as mensagens ao usuario.
		} else {
			//nao faz nada
		}

	}//cadastrarUsuario()

	public void mostraCampoInvalido(JLabel label, boolean status){

		if(status){
			label.setForeground(Color.RED);
		} else {
			label.setForeground(Color.BLACK);
		}

	}//mostraCampoInvalido()

	//Create and set up number formats. These objects also
	//parse numbers input by user.
	private void setUpFormats() {

		valorConsultaDisplayFormat = NumberFormat.getCurrencyInstance();
		valorConsultaDisplayFormat.setMinimumFractionDigits(2);
		valorConsultaEditFormat = NumberFormat.getNumberInstance();
		valorConsultaEditFormat.setMinimumFractionDigits(2);

	}

	@Override
	public void propertyChange(PropertyChangeEvent e) {

		if (txtValorConsulta.getValue() != null) {
			double valorConsulta = ((Number)txtValorConsulta.getValue()).doubleValue();
			if(valorConsulta < 0) {
				valorConsulta = Math.abs(valorConsulta);
				txtValorConsulta.setValue(valorConsulta);
			}
		}


	}


	@Override
	public void actionPerformed(ActionEvent event) {

		String comando = event.getActionCommand(); 

		if (comando.equalsIgnoreCase(btnSalvar.getActionCommand())) {
			cadastrarUsuario();
		}else if (comando.equalsIgnoreCase(btnEditar.getActionCommand())) {
			editarUsuario();
		} else if (comando.equals(btnCancelar.getActionCommand())) {
			this.dispose();
		}

	}

	/**
	 * @return the lblNomeCompleto
	 */
	public JLabel getLblNomeCompleto() {
		return lblNomeCompleto;
	}

	/**
	 * @param lblNomeCompleto the lblNomeCompleto to set
	 */
	public void setLblNomeCompleto(JLabel lblNomeCompleto) {
		this.lblNomeCompleto = lblNomeCompleto;
	}

	/**
	 * @return the lblDataNascimento
	 */
	public JLabel getLblDataNascimento() {
		return lblDataNascimento;
	}

	/**
	 * @param lblDataNascimento the lblDataNascimento to set
	 */
	public void setLblDataNascimento(JLabel lblDataNascimento) {
		this.lblDataNascimento = lblDataNascimento;
	}

	/**
	 * @return the lblCpf
	 */
	public JLabel getLblCpf() {
		return lblCpf;
	}

	/**
	 * @param lblCpf the lblCpf to set
	 */
	public void setLblCpf(JLabel lblCpf) {
		this.lblCpf = lblCpf;
	}

	/**
	 * @return the lblEmail
	 */
	public JLabel getLblEmail() {
		return lblEmail;
	}

	/**
	 * @param lblEmail the lblEmail to set
	 */
	public void setLblEmail(JLabel lblEmail) {
		this.lblEmail = lblEmail;
	}

	/**
	 * @return the lblLogin
	 */
	public JLabel getLblLogin() {
		return lblLogin;
	}

	/**
	 * @param lblLogin the lblLogin to set
	 */
	public void setLblLogin(JLabel lblLogin) {
		this.lblLogin = lblLogin;
	}

	/**
	 * @return the lblSenha
	 */
	public JLabel getLblSenha() {
		return lblSenha;
	}

	/**
	 * @param lblSenha the lblSenha to set
	 */
	public void setLblSenha(JLabel lblSenha) {
		this.lblSenha = lblSenha;
	}

	/**
	 * @return the lblConfirmacaoSenha
	 */
	public JLabel getLblConfirmacaoSenha() {
		return lblConfirmacaoSenha;
	}

	/**
	 * @param lblConfirmacaoSenha the lblConfirmacaoSenha to set
	 */
	public void setLblConfirmacaoSenha(JLabel lblConfirmacaoSenha) {
		this.lblConfirmacaoSenha = lblConfirmacaoSenha;
	}

	/**
	 * @return the lblCrm
	 */
	public JLabel getLblCrm() {
		return lblCrm;
	}

	/**
	 * @param lblCrm the lblCrm to set
	 */
	public void setLblCrm(JLabel lblCrm) {
		this.lblCrm = lblCrm;
	}

	/**
	 * @return the lblHorarioAtendimento
	 */
	public JLabel getLblHorarioAtendimento() {
		return lblHorarioAtendimento;
	}

	/**
	 * @param lblHorarioAtendimento the lblHorarioAtendimento to set
	 */
	public void setLblHorarioAtendimento(JLabel lblHorarioAtendimento) {
		this.lblHorarioAtendimento = lblHorarioAtendimento;
	}

	/**
	 * @return the lblInicio
	 */
	public JLabel getLblInicio() {
		return lblInicio;
	}

	/**
	 * @param lblInicio the lblInicio to set
	 */
	public void setLblInicio(JLabel lblInicio) {
		this.lblInicio = lblInicio;
	}

	/**
	 * @return the lblFim
	 */
	public JLabel getLblFim() {
		return lblFim;
	}

	/**
	 * @param lblFim the lblFim to set
	 */
	public void setLblFim(JLabel lblFim) {
		this.lblFim = lblFim;
	}

	/**
	 * @return the lblEspecialidade
	 */
	public JLabel getLblEspecialidade() {
		return lblEspecialidade;
	}

	/**
	 * @param lblEspecialidade the lblEspecialidade to set
	 */
	public void setLblEspecialidade(JLabel lblEspecialidade) {
		this.lblEspecialidade = lblEspecialidade;
	}

	/**
	 * @return the txtConfirmaSenha
	 */
	public JPasswordField getTxtConfirmaSenha() {
		return txtConfirmaSenha;
	}

	/**
	 * @param txtConfirmaSenha the txtConfirmaSenha to set
	 */
	public void setTxtConfirmaSenha(JPasswordField txtConfirmaSenha) {
		this.txtConfirmaSenha = txtConfirmaSenha;
	}

	/**
	 * @return the comboBoxCrmUF
	 */
	public JComboBox<String> getComboBoxCrmUF() {
		return comboBoxCrmUF;
	}

	/**
	 * @param comboBoxCrmUF the comboBoxCrmUF to set
	 */
	public void setComboBoxCrmUF(JComboBox<String> comboBoxCrmUF) {
		this.comboBoxCrmUF = comboBoxCrmUF;
	}

	/**
	 * @return the comboBoxHoraInicio
	 */
	public JComboBox<String> getComboBoxHoraInicio() {
		return comboBoxHoraInicio;
	}

	/**
	 * @param comboBoxHoraInicio the comboBoxHoraInicio to set
	 */
	public void setComboBoxHoraInicio(JComboBox<String> comboBoxHoraInicio) {
		this.comboBoxHoraInicio = comboBoxHoraInicio;
	}

	/**
	 * @return the comboBoxHoraFim
	 */
	public JComboBox<String> getComboBoxHoraFim() {
		return comboBoxHoraFim;
	}

	/**
	 * @param comboBoxHoraFim the comboBoxHoraFim to set
	 */
	public void setComboBoxHoraFim(JComboBox<String> comboBoxHoraFim) {
		this.comboBoxHoraFim = comboBoxHoraFim;
	}

}
